home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / DB / NestedSet / TreeMenu.php < prev   
PHP Script  |  2004-03-24  |  7KB  |  169 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PEAR :: DB_NestedSet_TreeMenu                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2003 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Jason Rust <jrust@rustyparts.com>                           |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: TreeMenu.php,v 1.10 2003/07/18 18:52:10 jrust Exp $
  20. //
  21.  
  22. require_once 'HTML/TreeMenu.php';
  23.  
  24. // {{{ DB_NestedSet_TreeMenu:: class
  25.  
  26. /**
  27.  * A helper class to translate the data from a nested set table into a HTML_TreeMenu object
  28.  * so that it can be used to create a dynamic tree menu using the PEAR HTML_TreeMenu class.
  29.  *
  30.  * @see          docs/TreeMenu_example.php
  31.  * @author       Jason Rust <jrust@rustyparts.com>
  32.  * @package      DB_NestedSet
  33.  * @version      $Revision: 1.10 $
  34.  * @access       public
  35.  */
  36. // }}}
  37. class DB_NestedSet_TreeMenu extends DB_NestedSet_Output {
  38.     // {{{ properties
  39.  
  40.     /**
  41.     * @var array The current menu structure
  42.     * @access private
  43.     */
  44.     var $_structTreeMenu = false;
  45.  
  46.     // }}}
  47.     // {{{ DB_NestedSet_TreeMenu
  48.  
  49.     function &DB_NestedSet_TreeMenu($params) {
  50.         $this->_structTreeMenu =& $this->_createFromStructure($params);
  51.     }
  52.  
  53.     // }}}
  54.     // {{{ _createFromStructure()
  55.  
  56.     /**
  57.      * <pre>Creates a HTML_TreeMenu structure based off of the results from getAllNodes() method
  58.      * of the DB_NestedSet class.  The needed parameters are:
  59.      * o 'structure' => the result from $nestedSet->getAllNodes(true) 
  60.      * o 'textField' => the field in the table that has the text for node
  61.      * o 'linkField' => the field in the table that has the link for the node
  62.      * o 'options' => (optional) an array of any additional options to pass to the node when
  63.      * Additionally these parameters may be added to the individual nodes to control their
  64.      * behavior:
  65.      * o 'ensureVisible' => (optional) whether or not the field should be forced as visible
  66.      *                creating it such as 'icon' or 'expandedIcon'
  67.      * o 'events' => (optional) an array of any events to pass to the node when creating it
  68.      *               such as 'onclick' or 'onexpand'</pre>
  69.      *
  70.      * @access public
  71.      * @return object A HTML_TreeMenu object
  72.      */
  73.     function &_createFromStructure($params)
  74.     {
  75.         // Basically we go through the array of nodes checking to see 
  76.         // if each node has children and if so recursing.  The reason this
  77.         // works is because the data from getAllNodes() is ordered by level
  78.         // so a root node will always be first, and sub children will always
  79.         // be after them.
  80.         if (!isset($params['treeMenu'])) {
  81.             $treeMenu =& new HTML_TreeMenu();
  82.         } else {
  83.             $treeMenu =& $params['treeMenu'];
  84.         }
  85.  
  86.         // always start at level 1
  87.         if (!isset($params['currentLevel'])) {
  88.             $params['currentLevel'] = 1;
  89.         }
  90.  
  91.         // have to use a while loop here because foreach works on a copy of the array and
  92.         // the child nodes are passed by reference during the recursion so that the parent 
  93.         // will know when they have been hit. 
  94.         reset($params['structure']);
  95.         while(list($key, $node) = each($params['structure'])) {
  96.             // see if we've already been here before
  97.             if (isset($node['hit'])) {
  98.                 continue;
  99.             }
  100.  
  101.             // mark that we've hit this node
  102.             $params['structure'][$key]['hit'] = $node['hit'] = true;
  103.             $tag = array(
  104.                 'text' => $node[$params['textField']], 
  105.                 'link' => $node[$params['linkField']],
  106.                 'ensureVisible' => isset($node['ensureVisible']) ? $node['ensureVisible'] : false,
  107.             );
  108.             $options = isset($params['options']) ? array_merge($params['options'], $tag) : $tag;
  109.             $events = isset($node['events']) ? $node['events'] : array();
  110.             $parentNode =& $treeMenu->addItem(new HTML_TreeNode($options, $events));
  111.             // see if it has children
  112.             if (($node['r'] - 1) != $node['l']) {
  113.                 $children = array();
  114.                 // harvest all the children
  115.                 $tempStructure = $params['structure'];
  116.                 foreach ($tempStructure as $childKey => $childNode) {
  117.                     if (!isset($childNode['hit']) && 
  118.                         $childNode['l'] > $node['l'] &&
  119.                         $childNode['r'] < $node['r'] &&
  120.                         $childNode['rootid'] == $node['rootid']) {
  121.                         // important that we assign it by reference here, so that when the child
  122.                         // marks itself 'hit' the parent loops will know
  123.                         $children[] =& $params['structure'][$childKey];
  124.                     }
  125.                 }
  126.  
  127.                 $recurseParams = $params;
  128.                 $recurseParams['structure'] = $children;
  129.                 $recurseParams['treeMenu'] =& $parentNode;
  130.                 $recurseParams['currentLevel']++;
  131.                 $this->_createFromStructure($recurseParams);
  132.             }
  133.         }
  134.  
  135.         return $treeMenu;
  136.     }
  137.  
  138.     // }}}
  139.     // {{{ printTree()
  140.  
  141.     /**
  142.      * Print's the current tree using the output driver
  143.      *
  144.      * @access public
  145.      */            
  146.     function printTree() {
  147.         $options = $this->_getOptions('printTree');
  148.         $tree =& new HTML_TreeMenu_DHTML($this->_structTreeMenu, $options);
  149.         $tree->printMenu();
  150.     }
  151.  
  152.     // }}}
  153.     // {{{ printListbox()
  154.  
  155.     /**
  156.      * Print's a listbox representing the current tree
  157.      *
  158.      * @access public
  159.      */                
  160.     function printListbox() {
  161.         $options = $this->_getOptions('printListbox');
  162.         $listBox  =& new HTML_TreeMenu_Listbox($this->_structTreeMenu, $options);
  163.         $listBox->printMenu();
  164.     }
  165.  
  166.     // }}}
  167. }
  168. ?>
  169.